package Controller

import (
	"encoding/json"
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"github.com/gin-gonic/gin"
	"net/http"
	"net/url"
	"strings"
	"time"
)

// GetImage 改为爬虫方式获取图片
func GetImage(c *gin.Context) {
	keyword := c.Query("keyword")
	if keyword == "" {
		keyword = "风景"
	}

	// 通过必应图片搜索获取结果
	imageUrls, err := bingImageSearch(keyword)
	if err != nil {
		c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
			"error": "图片搜索失败: " + err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{"images": imageUrls})
}

// 必应图片搜索爬虫
func bingImageSearch(keyword string) ([]string, error) {
	// 1. 构造搜索URL
	baseURL := "https://cn.bing.com/images/search?"
	params := url.Values{
		"q":  []string{keyword},
		"qs": []string{"n"}, // 最新排序
	}
	searchURL := baseURL + params.Encode()

	// 2. 发送请求（模拟浏览器访问）
	client := &http.Client{
		Timeout: 10 * time.Second,
	}
	req, _ := http.NewRequest("GET", searchURL, nil)
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != 200 {
		return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, resp.Status)
	}

	// 3. 解析HTML
	doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		return nil, err
	}

	// 4. 提取图片URL（根据必应页面结构调整选择器）
	var imageUrls []string
	doc.Find(".iusc").Each(func(i int, s *goquery.Selection) {
		if src, exists := s.Attr("m"); exists {
			// 解析JSON格式的元数据
			var data struct {
				Murl string `json:"murl"`
			}
			if json.Unmarshal([]byte(src), &data) == nil && data.Murl != "" {
				// 过滤非HTTP链接
				if strings.HasPrefix(data.Murl, "http") {
					imageUrls = append(imageUrls, data.Murl)
				}
			}
		}
	})

	if len(imageUrls) == 0 {
		return nil, fmt.Errorf("未找到相关图片")
	}

	// 限制返回数量
	if len(imageUrls) > 10 {
		imageUrls = imageUrls[:10]
	}

	return imageUrls, nil
}
